Processors are electronic circuits capable of executing one or more sequences of instructions, tasks, or threads. In a conventional processor, operations are executed in series. As such, if an operation takes a long time to complete (e.g., if its completion depends upon the result of an external event), a subsequent operation still has to wait in a queue. The wait occurs even when execution of the subsequent operation is independent from that of the preceding operation, and regardless of whether the processor is otherwise available during that time.
The concept of multithreading or multitasking was developed, at least in part, to improve the use of available computing resources. Generally speaking, a multithreading or multitasking processor includes hardware support for switching between different instructions, tasks, or threads more efficiently than conventional processors.
As a processor operates, errors may occur. And, in the event of an error, techniques exist to capture state information of the processor at the time of that error. Such information may include, for instance, register values, pointers, program counters, condition codes, and the like. A debugging tool may then be used to analyze that captured information.
As the inventors have recognized, complex debug operations often need to evaluate resources that are only accessible by executing specific or arbitrary instructions as part of the debugging process. Accordingly, the inventors have developed systems and methods that enable a debugger to execute an arbitrary instruction in a multithread processor without interfering with the execution of other threads.